大家好,鐵人賽第二十天,今天我們要進行一個非常酷炫且實用的整合!
在前幾天,我們學習了如何使用 adk-mcp
來建立天氣工具,並將其部署為 API。今天,我們將把這個能力推向一個全新的高度——我們將整合一個開源的 Wazuh MCP Server,讓我們的 AI Agent 能夠直接查詢 Wazuh 的警報和代理程式狀態!
Wazuh 是一個開源的 XDR (eXtended Detection and Response) 平台,提供安全監控、日誌分析、入侵偵測等功能。想像一下,你的 AI Agent 不再只是回答問題,它還能成為你的資安助手,主動或被動地分析安全事件!
我們將利用 adk-mcp
作為 MCP Host,連接到 Wazuh MCP Server,然後透過 adk api_server
將這個具備「資安洞察力」的 Agent 暴露為一個 API,為前端應用程式提供服務。
我們將假設讀者已經安裝並配置好 Wazuh Manager 和至少一個 Agent。
這個由社群開發的 Wazuh MCP Server 是一個 Rust 語言實現的服務,它將 Wazuh 的 RESTful API 和 Indexer (OpenSearch/Elasticsearch) 包裝成符合 MCP 協議的工具。
.env
設定檔Wazuh MCP Server 運行時需要知道如何連接到你的 Wazuh Manager API 和 Indexer。我們透過一個 .env
檔案來提供這些機敏資訊。
在你的專案根目錄下,建立一個名為 .env
的檔案,並填入以下內容(請替換為你實際的 Wazuh 配置):
WAZUH_API_HOST=your_wazuh_manager_api_host
WAZUH_API_PORT=55000
WAZUH_API_USERNAME=your_wazuh_api_user
WAZUH_API_PASSWORD=your_wazuh_api_password
WAZUH_INDEXER_HOST=your_wazuh_indexer_host
WAZUH_INDEXER_PORT=9200
WAZUH_INDEXER_USERNAME=your_wazuh_indexer_user
WAZUH_INDEXER_PASSWORD=your_wazuh_indexer_password
WAZUH_VERIFY_SSL=false
WAZUH_TEST_PROTOCOL=https
RUST_LOG=info
變數 | 說明 | 取得方法 |
---|---|---|
WAZUH_API_HOST |
Wazuh Manager API 的主機名稱或 IP | 到你安裝 Wazuh Manager 的那台機器,輸入 hostname -I 或在 Wazuh 部署文件中查 IP。若有設定網域(如 wazuh.mycompany.com ),可直接用網域。 |
WAZUH_API_PORT |
Wazuh API 的連接埠,預設是 55000 | 如果沒改過設定,可以直接用 55000;否則可查看 /var/ossec/api/configuration/api.yaml 的 port: 欄位 |
WAZUH_API_USERNAME |
Wazuh API 登入帳號 | 預設是 wazuh (如果沒改過)。可以用 sudo /var/ossec/bin/wazuh-apid -u 查看 API 使用者,或查 Wazuh Manager 建立的帳號文件。 |
WAZUH_API_PASSWORD |
Wazuh API 登入密碼 | 在安裝時產生,或管理員自行設定。若忘了,可以在 Manager 上用 sudo /var/ossec/bin/wazuh-apid -u wazuh 來重設密碼。 |
變數 | 說明 | 取得方法 |
---|---|---|
WAZUH_INDEXER_HOST |
Indexer 伺服器的主機名稱或 IP | 到安裝 Wazuh Indexer 的機器查看 IP 或網域 |
WAZUH_INDEXER_PORT |
Indexer 的連接埠 | 預設 9200 |
WAZUH_INDEXER_USERNAME |
Indexer 登入帳號 | 預設是 admin (除非有自訂) |
WAZUH_INDEXER_PASSWORD |
Indexer 登入密碼 | 安裝時在 /etc/wazuh-indexer/opensearch-security/admin-password (或 /etc/elasticsearch )可找到,或問部署的人員 |
變數 | 說明 |
---|---|
WAZUH_VERIFY_SSL |
是否驗證 SSL 憑證,false 表示忽略 |
WAZUH_TEST_PROTOCOL |
使用協議,通常是 https |
RUST_LOG |
設定日誌等級,info 表示一般訊息 |
提示: 如果你不確定 Wazuh 的配置,可以使用以下指令來協助查詢:
# 先確認服務狀態 sudo systemctl status wazuh-dashboard wazuh-manager wazuh-indexer
查看 Dashboard 連 Manager API 的帳密
sudo sed -n '1,200p' /usr/share/wazuh-dashboard/data/wazuh/config/wazuh.yml 2\>/dev/null sudo sed -n '1,200p' /etc/wazuh-dashboard/wazuh.yml 2\>/dev/null sudo sed -n '/^hosts:/,$p' /usr/share/wazuh-dashboard/data/wazuh/config/wazuh.yml 2\>/dev/null
查看 Dashboard 連 Indexer(OpenSearch)的帳密
sudo grep -E "opensearch.username|opensearch.password" /etc/wazuh-dashboard/opensearch\_dashboards.yml
Wazuh MCP Server 通常以 Docker 容器運行。請確保你的 Docker Desktop 已經啟動。
docker run -d --name mcp-wazuh-server --env-file .env -p 8080:8080 gbrigandi/mcp-server-wazuh
--env-file .env
: 告訴 Docker 容器去讀取我們剛才建立的 .env
檔案。-p 8080:8080
: 將容器內部的 8080 埠口映射到主機的 8080 埠口。這個伺服器會在這個埠口提供 MCP 服務。現在 Wazuh MCP Server 已經運行起來了,它會將 Wazuh 的功能封裝為 list_alerts
(列出警報)、get_agent_info
(獲取代理程式資訊) 等 MCP 工具。我們需要讓 adk-mcp
知道如何連接到它。
multi_tool_agent.py
建立一個名為 multi_tool_agent.py
的檔案。這個 Agent 將結合之前學過的 MCPToolset
來連接 Wazuh MCP Server。
import os
from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset
from google.adk.tools.mcp_tool.mcp_session_manager import StdioConnectionParams
from mcp import StdioServerParameters
wazuh_toolset = MCPToolset(
connection_params=StdioConnectionParams(
server_params=StdioServerParameters(
command='docker',
args=[
"run", "--rm", "-i",
"--env-file", "/Users/imac/WazuhMcp/.env", # 請將此路徑替換為你的 WazuhMcp .env 檔案路徑
"ghcr.io/gbrigandi/mcp-server-wazuh:latest"
],
),
),
)
root_agent = LlmAgent(
model='gemini-2.5-flash',
name='wazuh_agent',
instruction=(
"你是一個 Wazuh 資安助理。你的任務是使用提供的工具來回答關於 Wazuh 平台的查詢。"
"如果使用者說查詢最近幾筆的話,就limit在5筆以內。"
"請根據使用者的問題,選擇最合適的工具來回覆準確的資訊,並且把得到的資訊彙整起來給使用者。"
),
tools=[
wazuh_toolset
],
)
.env
)我們的 Agent 需要呼叫 Google Gemini 模型,所以請在專案根目錄下建立另一個 .env
檔案,並填入你的 Google API Key:
GOOGLE_GENAI_USE_VERTEXAI=FALSE
GOOGLE_API_KEY=YourGoogleApiKey
adk api_server
現在,我們將這個具備 Wazuh 查詢能力的 Agent,透過 adk api_server
暴露為一個 Web API。
adk api_server .
這會啟動一個 API 服務,通常在 http://localhost:8000
。這個服務會自動偵測當前目錄下的 Agent 檔案。adk api_server
提供了完整的 RESTful API,讓我們可以透過 HTTP 請求來與 Agent 互動。
首先,我們需要為每次對話建立一個 Session ID。這讓 Agent 能在多輪對話中保持上下文。
adk api_server
仍在運行)。curl
指令:curl -X POST http://localhost:8000/apps/multi_tool_agent/users/u_123/sessions/s_123 \
-H "Content-Type: application/json" \
-d '{"state": {"key1": "value1", "key2": 42}}'
multi_tool_agent
:這是我們在 multi_tool_agent.py
中 Agent 實例的 name
。簡單來說就是你的{app_name}。u_123
, s_123
: 使用者 ID 和會話 ID,你可以自定義。終端畫面:
後端畫面:
現在,我們可以向 Agent 發送實際的查詢請求了!
curl -X POST http://localhost:8000/run \
-H "Content-Type: application/json" \
-d '{
"app_name": "multi_tool_agent",
"user_id": "u_123",
"session_id": "s_123",
"new_message": {
"role": "user",
"parts": [{
"text": "請給我最近五筆wazuh警報"
}]
}
}'
app_name
: 同樣是我們 Agent 的 name
。new_message
: 包含使用者提出的問題。如果你已經有運行中的 Wazuh Agent 產生警報,你將會收到來自 Agent 的回應,內容是從 Wazuh MCP Server 獲取到的最新警報資訊!
終端畫面:
下面是adk mcp給我的回覆:
後端畫面:前面會跳一大堆 DEBUG,我這邊就省略囉~~
今天,我們完成了一項極具挑戰和價值的整合:
adk-mcp
整合外部工具: 再次證明 MCPToolset
和 HttpConnectionParams
是連接任何基於 HTTP 的 MCP Server 的利器。adk api_server
,我們的 Wazuh Security Agent 不再只是一個本地腳本,而是一個可供任何 HTTP 客戶端呼叫的強大服務。這不僅僅是 MCP 的實踐,更是展示了如何將傳統的 IT 維運與現代 AI Agent 深度融合,為資安監控帶來全新的可能性。
接下來幾天,我們將利用今天部署的這個 adk-api
服務,來打造一個 Swift iOS App !敬請期待!